#ifndef OBJETO_3D_H
#define OBJETO_3D_H

#include "Raio.h"
#include "Vetor_3d.h"
#include "TexturePoint.h"
#include <cmath>
#include <QDebug>
#include <QtAlgorithms>

#define SQR(X) (X*X)
#define MINI(x,y) (x<y?x:y)
#define MAXI(x,y) (x>y?x:y)
#define ZERO 0.0001

//* classe Objeto_3D #Objeto_3D#
  //* Esta classe e mae das classes Esfera, CaixaParalela e Triangulo.
class Objeto_3D {
  protected:
    int indice_textura;
    Ponto_3D centro;
    float raio;
 public:
 //* Construtor e Destrutor
    Objeto_3D(int _indice_textura) : indice_textura( _indice_textura ) {}
    Objeto_3D(const Objeto_3D& obj) : indice_textura( obj.Indice_textura() ), centro(obj.getCentro()), raio(obj.getRaio()) {}
          virtual ~Objeto_3D() {}
 //* Funcoes puras virtuais para serem implementadas pelos herdeiros
    virtual const Objeto_3D* Intercepta( Raio r_vis, float* t) const = 0;
    virtual Vetor_3D normal( const Ponto_3D& ponto ) const  = 0;

    //* Funcoes virtuais que podem ser reimplementadas pelos herdeiros
    virtual int Indice_textura() const { return indice_textura; }
    virtual float getRaio() const { return raio; }
    virtual const Ponto_3D& getCentro() const { return centro; }
    virtual void setCentro(const Ponto_3D& _centro) { centro = _centro; }
    virtual void setIndiceTextura(int indice) { indice_textura = indice; }
    virtual void setRaio(float _raio) { raio = _raio; }
    virtual TexturePoint pontoTextura(const Ponto_3D& ponto) const {  ponto.X(); return TexturePoint(0,0); }
};

#endif // OBJETO_3D_H
